/*
 * @Description:
 * @Author: dh
 * @Date: 2021-09-24 14:42:07
 * @LastEditors: dh
 * @LastEditTime: 2024-05-14 16:00:22
 */

// 类的属性和方法——Class
class Greeter<T> {
	// 静态属性，只能通过 Greeter 访问，不能访问实例this
	static cname: string = 'Greeter'
	// #号属性，只能在内部访问
	#name: string | undefined

	/* 以下属性修饰仅在ts的类中有效 */
	// private表示私有，私有的意思就是除了class自己内部之外，任何人都不可以直接使用，包括自己。
	private age = '20'
	// 能在类的内部访问和子类中访问
	protected sex = 'boy'
	//public 默认 表明该数据成员、成员函数是对所有用户开放的，所有子类内部可以使用，外部不行
	public com = 'msg'
	//属性设置为只读
	readonly lick = 'eat'

	// 定义接收的参数 ，默认 public
	public message: string
	private name?: string
	constructor(message: string, name?: string) {
		this.message = message
		this.name = name
		this.#name = name
	}
	static getClassName() {
		return 'Class name is Greeter'
	}
	greet() {
		return 'Hello, ' + this.message
	}
}

let greeter = new Greeter('world')

// TODO  interface 约束 class
interface Entity {
	title?: string
	log(): void
	age: number
}
interface Entity2 {
	like: string
}

class Post implements Entity, Entity2 {
	title: string
	age: number
	like: string
	constructor(title: string, age: number, like: string) {
		this.title = title
		this.age = age
		this.like = like
	}
	log(): void {
		console.log(this.title)
	}
}

var post = new Post('abc', 20, 'eat')

// TODO  继承
class Axios {
	push(): void {}
}
class Get implements Axios, Entity, Entity2 {
	title: string
	age: number
	like: string
	constructor(title: string, age: number, like: string) {
		this.title = title
		this.age = age
		this.like = like
	}
	log(): void {
		console.log(this.title)
	}
	push(): void {}
}

const get = new Get('deng', 20, 'lei')
get.push()
get.log()

// TODO 抽象类 和 派生类 ，这种类不能直接实例化，需要实现子类继承
abstract class Http {
	name: string
	age?: number
	constructor(name: string, age: number = 20) {
		this.name = name
		this.age = age
	}
	// 定义了一个方法
	abstract cb(): any
}

class Put extends Http {
	constructor(name: string) {
		super(name, 30)
	}
	// 实现方法
	cb() {}
}
